package online.model.check;

import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import online.model.UniModel;
import online.model.session.ActionParameter;
import online.model.session.SessionUser;
import core.config.Env;

/**
 * 入力チェック親クラス
 *
 * @author Tadashi Nakayama
 * @version 1.0.0
 */
public abstract class ItemCheckBase {

	/** マッピング */
	private static final Charset MAPPING;
	/** チェックするマッピングを設定（Windows-31J, SJIS） */
	private static final String ENV_SERVLET_JAVA_MAPPING = "Servlet.JavaMapping";

	/** アクションパラメタ */
	private ActionParameter ap = null;
	/** セションユーザ情報 */
	private SessionUser su = null;
	/** 汎用モデル */
	private UniModel um = null;
	/** 参照パラメタキーセット */
	private Map<String, String[]> ref = null;
	/** トップメッセージ */
	private List<String> mlist = null;
	/** トップメッセージステータス */
	private List<String> slist = null;
	/** 削除フラグ位置 */
	private int[] delFlg = new int[0];

	static {
		String mpg = Env.getEnv(ENV_SERVLET_JAVA_MAPPING);
		if (!Objects.toString(mpg, "").isEmpty()) {
			MAPPING = Charset.forName(mpg);
		} else {
			MAPPING = null;
		}
	}

	/**
	 * チェックマッピング取得
	 *
	 * @return チェックマッピング
	 */
	protected static Charset getMapping() {
		return MAPPING;
	}

	/**
	 * アクションパラメタ設定
	 *
	 * @param param 汎用フォーム
	 */
	final void setActionParameter(final ActionParameter param) {
		this.ap = param;
	}

	/**
	 * アクションパラメタ取得
	 * @return アクションパラメタ
	 */
	protected final ActionParameter getActionParameter() {
		return this.ap;
	}

	/**
	 * セションユーザ情報設定
	 * @param user セションユーザ情報
	 */
	final void setSessionUser(final SessionUser user) {
		this.su = user;
	}

	/**
	 * セションユーザ情報取得
	 * @return セションユーザ情報
	 */
	protected final SessionUser getSessionUser() {
		return this.su;
	}

	/**
	 * 汎用モデル設定
	 * @param model 汎用モデル
	 */
	final void setUniModel(final UniModel model) {
		this.um = model;
	}

	/**
	 * 汎用モデル取得
	 * @return 汎用モデル
	 */
	protected final UniModel getUniModel() {
		return this.um;
	}

	/**
	 * 削除フラグ設定
	 *
	 * @param vals 削除フラグ配列
	 */
	final void setDelFlg(final int[] vals) {
		this.delFlg = new int[0];
		if (vals != null) {
			this.delFlg = vals.clone();
		}
	}

	/**
	 * 削除フラグ取得
	 * @return 削除フラグ
	 */
	protected final int[] getDelFlg() {
		return this.delFlg.clone();
	}

	/**
	 * メッセージリスト設定
	 * @param m メッセージリスト
	 * @param s ステータスリスト
	 */
	final void setMessageList(final List<String> m, final List<String> s) {
		this.mlist = m;
		this.slist = s;
	}

	/**
	 * メッセージリスト取得
	 * @return メッセージリスト
	 */
	protected final List<String> getMessageList() {
		return this.mlist;
	}

	/**
	 * ステータスリスト取得
	 * @return ステータスリスト
	 */
	protected final List<String> getStatusList() {
		return this.slist;
	}

	/**
	 * 参照パラメタキーセット設定
	 *
	 * @param val 参照パラメタキーセット
	 */
	final void setReferenceMap(final Map<String, String[]> val) {
		this.ref = val;
	}

	/**
	 * パラメタ値取得
	 *
	 * @param key キー
	 * @return パラメタ値
	 */
	protected final String[] getArrayParameter(final String key) {
		String[] ret = this.ref.get(key);
		if (ret == null) {
			ret = this.ap.getArrayParameter(key);
			this.ref.put(key, ret);
		}
		return ret;
	}
}
